/*
 * UMediaFrame.h
 *
 *  Created on: 2020年7月11日
 *      Author: terry
 */

#ifndef UMEDIAFRAME_H_
#define UMEDIAFRAME_H_

#include "UMediaType.h"
#include "UPixelFormat.h"
#include "USampleFormat.h"


class DLLEXPORT UMediaFrame
{
public:
    explicit UMediaFrame(AVFrame* frame = nullptr, bool refIt = false);
    virtual ~UMediaFrame();

    UMediaFrame(const UMediaFrame& frame);
    UMediaFrame& operator = (const UMediaFrame& frame);

    AVFrame* get();
	const AVFrame* get() const;

    uint8_t ** data();
    uint8_t * data(size_t idx);
    int* linesize();
    int& linesize(size_t idx);
    void linesize(size_t idx, int size);


    int width() const;
    int height() const;
    int nb_samples() const;
    int format() const;
    int key_frame() const;
    int pict_type() const;

    int64_t pts() const;
    int64_t pkt_pts() const;
    void *opaque()  const;
    int flags() const;

    void set_width(int val);
    void set_height(int val);
    void set_nb_samples(int val);
    void set_format(int val);
    void set_key_frame(int val);
    void set_pict_type(int val);

    void set_pts(int64_t val);
    void set_pkt_pts(int64_t val);
    void set_opaque(void* val);
    void set_flags(int val);


    int channels()  const;
    int sample_rate()  const;
    int64_t channel_layout()  const;

    int64_t get_best_effort_timestamp() const;
    void    set_best_effort_timestamp(int64_t val);
    int64_t get_pkt_duration         () const;
    void    set_pkt_duration         (int64_t val);
    int64_t get_pkt_pos              () const;
    void    set_pkt_pos              (int64_t val);
    int64_t get_channel_layout       () const;
    void    set_channel_layout       (int64_t val);
    int     get_channels             () const;
    void    set_channels             (int     val);
    int     get_sample_rate          () const;
    void    set_sample_rate          (int     val);

    int     get_decode_error_flags   () const;
    void    set_decode_error_flags   (int     val);
    int     get_pkt_size() const;
    void    set_pkt_size(int val);


    int get_buffer(int align);

    bool is_writable() const;

    int make_writable();

    int copy(AVFrame* src);
    int copy_props(AVFrame* src);

    void reset();

    UMediaFrame& clone(AVFrame* src);

    void swap(UMediaFrame& other);

    bool create();
    bool ref(const AVFrame* src);
    bool ref(const UMediaFrame& src);

	bool isVideo() const;

protected:
    void cleanup();

protected:
    AVFrame*    m_avframe;
    bool    m_own;


};



#endif /* UMEDIAFRAME_H_ */
